<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // GO不会释放
        // function add(a, b){
        //     console.log(a + b);
        // }
        // add(1, 2);
        // 缺点：add执行一次，a,b变量一直存在GO中，没有被释放
    
        // 自动执行，执行完成以后立即释放
        // 立即执行函数
        // IIFE -immediately invoked function expression

        // (function(){
        //     var a = 1,
        //         b = 2;
        //     console.log(a + b);
        // })();
        // (function(){
        //     var a = 1,
        //         b = 2;
        //     console.log(a + b);
        // }()); // W3C建议

        // var num = (function(a, b){
        //     return a + b;
        // }(1, 2));
        // console.log(num);

        // (function(){}) // ()表达式

        // (function test1(){
        //     console.log(1);
        // })(); // ()表达式

        // var test2 = function (){
        //     console.log(2);
        // }(); // var x = fun(){} 表达式

        // function test3(){
        //     console.log(3);
        // }(); // 报错，语法错误
        
        // 一定是表达式才能被执行符号执行

        // var test1 = function(){
        //     console.log(2);
        // }();

        // console.log(test1); // undefined
        // 立即执行函数，执行完立即销毁
        // 立即执行函数自动忽略函数名

        // 函数声明变成表达式的方法 + - ! || &&...
        
        // function test(a){
        //     console.log(a);
        // }(6);
        // ()里没传值，系统认为是一个立即执行函数，当传值了，系统会当做一个表达式；
        
        // var num = (2 - 1, 6 + 5, 24 + 1);
        // console.log(num); // 25

        // function test(){
        //     var arr = [];
        //     for(var i = 0; i < 10; i++){
        //         arr[i] = function(){
        //             document.write(i + ' ');
        //         }
        //     }
        //     return arr;
        // }
        
        // 解
        // function test(){
        //     var arr = [];
        //     var i = 0;
        
        //     for(; i < 10; ){
        //         arr[i] = function(){
        //             document.write(i + ' ');
        //         }
        //         i++;
        //     }
        //     return arr;
        // }

        // var myArr = test();

        // for(var j = 0; j < myArr.length; j++){
        //     myArr[j]();
        // }
        // 10个10

        // 如果想要打印0-9呢？
        // 解1：在循环体内，立即执行函数
        // function test1(){
        //     var arr = [];
        //     for(var i = 0; i < 10; i++){
        //         arr[i] = (function(){
        //             document.write(i + ' ');
        //         })();
        //     }
        //     return arr;
        // }
        // test1();

        // 解2：在匿名函数传入参数
        // function test(){
        //     var arr = [];

        //     for(var i = 0; i < 10; i++){
        //         arr[i] = function(num){ // 传入num形参
        //             document.write(num + ' ');
        //         }
        //     }

        //     return arr;
        // }

        // var myArr = test();

        // for(var j = 0; j < myArr.length; j++){
        //     myArr[j](j); // 给num形参赋值
        // }

        // 解3：在循环体内，立即执行函数
        // function test1(){
        //     var arr = [];
        //     for(var i = 0; i < 10; i++){
        //         (function(j){
        //             arr[j] = function(){
        //                 document.write(j + ' ');
        //             };
        //         })(i);
        //     }
        //     return arr;
        // }
        // var myArr = test1();

        // for(var j = 0; j < myArr.length; j++){
        //     myArr[j]();
        // }
    </script>
</body> 
</html>